package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

//创建结构体的4种方式
func main() {

	//方式1
	var p1 Person
	p1.Name = "张三"
	p1.Age = 15
	fmt.Println(p1)

	//方式2
	p2 := Person{"mary", 20}
	fmt.Println(p2)

	//方式3 &
	//案例 var person *Person = new (Person)

	var p3 *Person = new(Person)
	//因为p3是一个指针，因此标准的给字段赋值方式
	// (*p3).Name = "smith" 也可以这样写 p3.Name = "switch"
	//原因：go的设计者 为了使用方便，底层会对p3.Name = "switch" 进行处理
	//会给p3加上取值运算(*p3).Name = "switch"
	(*p3).Name = "switch"
	p3.Name = "john"

	(*p3).Age = 30
	p3.Age = 10
	fmt.Println(*p3)

	//方式4  {}
	//案例： var person *Person = &Person{}

	var p4 *Person = &Person{}
	//var p4 *Person = &Person{"李四",18} 也可以创建的时候就赋值
	//因为p4是一个指针，因此标准的访问字段的方法
	// (*p4).Name = "scotte"
	//go设计者为了使用方便  和上面一样进行了相同处理
	(*p4).Name = "scotte"
	p4.Name = "marry"
	(*p4).Age = 30
	p4.Age = 25
	fmt.Println(*p4)
}
